﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>循环转换 - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The 循环转换 statement retrieves substrings (fields) from a 字符串, one at a time." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>循环转换</h1>

<p>每次从字符串中检索字符串(片段).</p>

<pre class="Syntax"><span class="func">循环转换</span> 字符串 <span class="optional">, Delimiters, OmitChars</span></pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>字符串</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
    <p>要分析的字符串.</p>
  </dd>

  <dt>Delimiters</dt>
  <dd>
      <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
      <p>如果此参数为空或省略, 那么将把输入字符串中的每个字符解析为单独的子字符串.</p>
      <p id="CSV">如果此参数为 <code>"CSV"</code>, 字符串将以标准的逗号分隔值格式进行解析. 下面是一个由 MS Excel 生成的 CSV 行的示例:</p>
<pre class="no-highlight">"first field",SecondField,"the word ""special"" is quoted literally",,"last field, has literal comma"</pre>
      <p>否则, <em>Delimiters</em> 包含一个或多个字符(区分大小写), 每个字符用于确定子串之间的边界位置.</p>
      <p>定界符不被认为是子串本身的一部分. 此外, 如果输入字符串中的一对定界符之间没有任何内容, 那么相应的子串将是空的.</p>
      <p>例如: <code>','</code>(逗号) 会根据每一个逗号的出现来划分字符串. 类似地, <code>内_跳格 内_空格</code> 会在每次输入字符串中出现空格或制表符时开始一个新的子串.</p>
      <p>要使用字符串作为定界符而不是字符, 首先使用 <a href="StrReplace.htm">字符串替换</a> 将所有出现的字符串替换为从未在文本中使用过的单个字符, 例如, 这些特殊字符之一: &cent;&curren;&yen;&brvbar;&sect;&copy;&ordf;&laquo;&reg;&micro;&para;. 考虑这个示例, 它使用字符串 &lt;br&gt; 作为分隔符:</p>
      <pre>NewHTML := StrReplace(HTMLString, "&lt;br&gt;", "&cent;")
循环转换, NewHTML, "&cent;" <em>; 使用 ￠ 解析字符串.</em>
{
...
}</pre>
  </dd>

  <dt>OmitChars</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
    <p>可选的字符列表(区分大小写), 用来从每个子字符串的开始和结尾部分移除这些字符. 例如, 如果 <em>OmitChars</em> 是 <code>内_空格 内_跳格</code>, 那么每个解析出来的子字符串中开始和结尾部分(但中间的不会) 的空格和 tab 会被移除.</p>
    <p>如果 <em>Delimiters</em> 为空, 那么 <em>OmitChars</em> 表示应该考虑移除哪些字符(它们将不会出现在循环中).</p>
  </dd>

</dl>

<h2 id="Remarks">备注</h2>
<p>当你想对一个字符串中包含的每一个片段进行操作时, 字符串解析循环很有用. 解析循环比 <a href="StrSplit.htm">分割字符串</a> 使用更少的内存且在大多数情况下更容易使用(尽管无论哪种方式使用的内存都是暂时的).</p>
<p id="LoopField">内置变量 <strong>内_循环属性</strong> 存在于任何解析循环中. 它包含了当前子字符串(片段) 的内容. 如果一个内层解析循环包含在一个外层解析循环中, 则最内层循环的片段将具有优先权.</p>
<p>尽管不存在内置变量 &quot;A_LoopDelimiter&quot;, 不过在此页面最底部的例子演示了如何检测在分割每个片段时是由于遇到哪个分隔符.</p>
<p>输入字符串或其片段没有大小限制.</p>
<p>要在解析前按不同的顺序排列字段, 请使用 <a href="Sort.htm">排序</a> 函数.</p>
<p>请参阅 <a href="Loop.htm">循环</a> 了解关于<a href="Block.htm">区块</a>, <a href="Break.htm">跳出</a>, <a href="Continue.htm">跳过</a> 和 内_循环次数 变量(其存在于各种类型的循环中) 的相关信息.</p>
<h2 id="Related">相关</h2>
<p><a href="StrSplit.htm">分割字符串</a>, <a href="LoopRead.htm">file-reading 循环</a>, <a href="Loop.htm">循环</a>, <a href="Break.htm">跳出</a>, <a href="Continue.htm">跳过</a>, <a href="Block.htm">区块</a>, <a href="Sort.htm">排序</a>, <a href="FileSetAttrib.htm">文件设置属性</a>, <a href="FileSetTime.htm">文件设置时间</a></p>
<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a href="#ExBasic">#1</a></p>
<pre>Colors := "red,green,blue"
循环转换, Colors, ","
{
    信息框 "Color number " 内_循环次数 " is " 内_循环属性
}</pre>
</div>

<div class="ex" id="ExFileRead">
<p><a href="#ExFileRead">#2</a>: 按行读取变量的内容, 一行接一行(类似于 <a href="LoopRead.htm">file-reading</a> 循环). 文件可以通过 <a href="FileRead.htm">读文件</a> 加载到变量中:</p>
<pre>循环转换, FileContents, "`n", "`r"  <em>; 在 `r 之前指定 `n, 这样可以同时支持对 Windows 和 Unix 文件的解析.</em>
{
    Result := 信息框("Line number " 内_循环次数 " is " 内_循环属性 ".`n`nContinue?",, "y/n")
}
直到 Result = "No"</pre>
</div>

<div class="ex" id="ExClipboard">
<p><a href="#ExClipboard">#3</a>: 除了用于剪贴板外, 这个例子和上一个一样. 每当剪贴板包含文件时这个例子很有用, 例如从打开的资源管理器窗口复制的文件(程序自动把这些文件转换为它们的文件名):</p>
<pre>循环转换, 内_剪贴板, "`n", "`r"
{
    Result := 信息框("File number " 内_循环次数 " is " 内_循环属性 ".`n`nContinue?",, "y/n")
}
直到 Result = "No"</pre>
</div>

<div class="ex" id="ExCSV">
<p><a href="#ExCSV">#4</a>: 解析逗号分隔值(CSV) 文件:</p>
<pre>循环读取, "C:\Database Export.csv"
{
    LineNumber := 内_循环次数
    循环转换, 内_循环读取行, "CSV"
    {
        Result := 信息框("Field " LineNumber "-" 内_循环次数 " is:`n" 内_循环属性 "`n`nContinue?",, "y/n")
        如果 Result = "No"
            返回
    }
}</pre>
</div>

<div class="ex" id="ExDelimiter">
<p><a href="#ExDelimiter">#5</a>: 判断遇到了哪个分隔符.</p>
<pre><em>; 初始化要搜索的字符串.</em>
Colors := "red,green|blue;yellow|cyan,magenta"
<em>; 初始化计数器来跟踪字符串中我们的位置.</em>
Position := 0

循环转换, Colors, ",|;"
{
    <em>; 计算在这个字段末尾分隔符的位置.</em>
    Position += 字符串长度(内_循环属性) + 1
    <em>; 获取解析循环中找到的分隔符.</em>
    Delimiter := 截取字符串(Colors, Position, 1)

    信息框 "Field: " 内_循环属性 "`nDelimiter: " Delimiter
}</pre>
</div>

</body>
</html>